import random

from faker import Faker

from tools.handle_db import handle_mysql
from tools.handle_loguru import logger


# 封装一个造假数据的类
# 1、可以生成随机中国手机号
# 2、可以随机生成中国人名
class HandleFaker:
    def __init__(self):
        self.fk = Faker(locale='zh-cn')

    # 1、造数据，中国手机号 ###############################################
    # 用faker库生成的随机手机号，如果系统对手机号前缀有要求的，要做前缀校验。本代码没做校验。
    def __faker_phone(self):
        phone = self.fk.phone_number()
        logger.debug(f"========= faker库生成的随机手机号为：{phone} =========")
        return phone

    # 在t_user表(2代理商3物业4普通员工5业主)中查询手机号是否已经被注册。
    def __select_phone(self, phone):
        sql = "select * from t_user where phone='{}'".format(phone)
        select_result = handle_mysql.get_db_all_data(sql=sql)
        return select_result

    def get_unregistered_phone(self):
        """
        获取未注册的手机号
        :return: 返回一个未注册的手机号。
        """
        logger.info(f"========= 用faker库生成一个随机数字手机号，然后连接数据库比对，如果数据库中无该号码，则为未注册手机号。 =========")
        while True:
            phone = self.__faker_phone()    # 随机生成手机号
            select_result = self.__select_phone(phone)     # 拿到数据库执行结果
            if len(select_result) > 0:
                continue
            else:
                logger.info(f"========= 用faker库生成未注册的手机号为：{phone} =========")
                return phone

    # 2、造数据，中国人名 ###############################################
    # 用faker库生成随机的中国人名。用faker库生成的人名一般是2~3个字，为保证测试数据在4~6位之间，加上 ”_T”  2个字符串。
    def __faker_user_name(self):
        user_name = self.fk.name() + '_测'
        logger.debug(f"========= faker库生成的随机中国人名为：{user_name} =========")
        return user_name

    # 在t_user表(2代理商3物业4普通员工5业主)中查询人名是否已经被注册。
    def __select_user_name(self, user_name):
        sql = "select * from t_user where user_name='{}'".format(user_name)
        select_result = handle_mysql.get_db_all_data(sql=sql)
        return select_result

    def get_unregistered_user_name(self):
        """
        获取未注册的中国人名
        :return: 返回一个未注册的中国人名。
        """
        logger.info(f"========= 用faker库生成一个随机中国人名，然后连接数据库比对，如果数据库中无该人名，则为未注册人名。 =========")
        while True:
            user_name = self.__faker_user_name()  # 随机生成中国人名
            select_result = self.__select_user_name(user_name)  # 拿到数据库执行结果
            if len(select_result) > 0:
                continue
            else:
                logger.info(f"========= 用faker库生成未注册的中国人名为：{user_name} =========")
                return user_name

    # 3、造数据，生成指定长度的字符串(人名) #################################
    # 用 random函数生成指定长度的字符串
    def __random_specify_length_user_name(self, str_length):
        """
        用random函数生成指定长度的字符串
        :param str_length: 生成字符串的长度，整数。
        :return: 返回生成指定长度的字符串。
        """
        chang_jian_xing = """李王张刘陈杨赵黄周吴徐孙胡朱高林何郭马罗梁宋郑谢韩唐冯于董萧程曹袁邓许傅沈曾彭吕苏卢蒋蔡贾丁魏薛叶阎余潘杜戴夏钟汪田任姜范方石姚谭廖邹熊金陆郝孔白"""

        all_ming = """梦琪忆柳之桃慕青问兰尔岚元香初夏沛菡傲珊曼文乐菱痴珊恨玉惜文香寒新柔语蓉海安夜蓉涵柏水桃醉蓝春儿语琴从彤傲晴语兰又菱碧彤元霜怜梦紫寒妙彤曼易南莲紫翠雨寒易烟如萱若南寻真晓亦向珊慕灵以蕊寻雁映易雪柳孤岚笑霜海云凝天沛珊寒云冰旋宛儿绿真盼儿晓霜碧凡夏菡曼香若烟半梦雅绿冰蓝灵槐平安书翠翠风香巧代云梦曼幼翠友巧听寒梦柏醉易访旋亦玉凌萱访卉怀亦笑蓝春翠靖柏夜蕾冰夏梦松书雪乐枫念薇靖雁寻春恨山从寒忆香觅波静曼凡旋以亦念露芷蕾千兰新波代真新蕾雁玉冷卉紫山千琴恨天傲芙盼山怀蝶冰兰山柏翠萱恨松问旋从南白易问筠如霜半芹丹珍冰彤亦寒寒雁怜云寻文乐丹翠"""

        xing = random.sample(chang_jian_xing, 1)
        xing = ''.join(xing)
        ming = random.sample(all_ming, str_length-1)
        ming = ''.join(ming)
        xing_ming = xing + ming
        return xing_ming

    def get_unregistered_user_name_specify_length(self, str_length):
        """
        获取指定长度未注册的用户名
        :param str_length: 用户名的长度，整数
        :return: 返回指定长度未注册的用户名
        """
        logger.info(f"========= 用random函数生成一个随机中国人名，然后连接数据库比对，如果数据库中无该人名，则为未注册人名。 =========")
        while True:
            user_name = self.__random_specify_length_user_name(str_length)  # 随机生成中国人名
            select_result = self.__select_user_name(user_name)  # 拿到数据库执行结果
            if len(select_result) > 0:
                continue
            else:
                logger.info(f"========= 用random函数生成未注册的中国人名为：{user_name} =========")
                return user_name

    # 4、造数据，生成随机地址 #################################
    def get_faker_random_address(self):
        """
        生成随机地址
        :return: 返回生成的随机地址字符串
        """
        faker_random_address = self.fk.address()
        logger.info(f"========= 用faker库生成的随机地址为：{faker_random_address} =========")
        return faker_random_address

    # 5、造数据，生成代理商 #################################
    # 用 random函数生成代理商
    def random_agent_name(self):
        """
        用random函数生成 xxxx代理商
        """
        end_name = "代理商"
        # 实验验证现象：长字符串用""""""表格时，有回车，在生成字符时，新字符串容易包含空格。
        start_name = """艾宇星方思蓝复吉名威先洁远英子天明雷方凡春宝运川圣新拓白旋坚丝西迪阳界迪高苏基威宜志安本浩茂汉鑫全方营风具智西信和力天方诗帝永发玛能清晶速盛磊风顺迎频诚雷迎江太苏蓝娇玛诺霸拓纽迈润缘环发源宝福亚苏领圆妙典赛志正精辉威月欣豪富环泰智江仕梦创木卓纽铭腾时好辰驰卓越利腾永建超贵祥诗娇格铁凯圆万通立川缘英识啸博顿倍耀润超妙实豪火德先友晶克通中真禾翔月圆霸风梦铭佩翔康顺博曼曼坚源聚阳建智优子辰优德正跃世妙永卓耀顿缘贝罗贝领益格铭威迈越科开硕奥诗润复超圣维凤方仕彩欧邦"""

        temp_str = random.sample(start_name, 2)
        get_start_name = ''.join(temp_str)
        agent_name_from_random = get_start_name + end_name
        logger.info(f"========= 用random函数生成的代理商为：{agent_name_from_random} =========")
        return agent_name_from_random

    # 6、造数据，生成物业公司 #################################
    # 用 random函数生成物业公司
    def random_property_company_name(self):
        """
        用random函数生成 xxxx物业公司
        """
        end_name = "物业"
        # 实验验证现象：长字符串用""""""表格时，有回车，在生成字符时，新字符串容易包含空格。
        start_name = """华通万明硕蓝弘益相安捷奇丰越东佳仁永飞玛拓万达运宝祥能顺发发梦耀振傲越真雷克信信德傲赛邦旋欧邦欣凯仁蓝格林特万达原光杰西安特原万德来曼卓日捷嘉全旭腾佩东祥辰力奥飞百成典益邦祥浩博涛正达爱运驰康双翔宏彩聚原正达龙恒川跃广通奥驰达立金洋帝远中隆驰立发智远罗讯翔裕吉泰复正凯湖皇冠仕联信诗安捷高华瑞霆远基梦驰达方贝旭傲普天润远创来弘鑫辰傲创精瑞格跃美佳电尚克同弘益迈优威润星泽欧正祥皇大诚风维高春悦成太吉泰码海丰先科迪高银辉罗金新良宝成频玉莱尚瑞贝通尚雅恒旭力达辰磊能金新百铭尼赛嘉信润百佳基永达成贝启洁嘉信汇幻影辉光亿同欣森中聚远环胜通博"""

        temp_str = random.sample(start_name, 2)
        get_start_name = ''.join(temp_str)
        property_company_name_from_random = get_start_name + end_name
        logger.info(f"========= 用random函数生成的物业公司为：{property_company_name_from_random} =========")
        return property_company_name_from_random

    # 7、生成营业执照注册日期（公司成立日期）、有效日期，以10年有效期为准。
    # 生成有效日期(过去日期+10年，一般公司的营业执照日期都是10年。)
    # 思路：'2020-12-04' 先用split分解成['2020', '12-04']，提取[下表为0]的年份，然后转化成int加上10年得到新的年份，然后用str转换成新字符用+拼接。
    def get_license_establish_validity_date(self):
        past_date = self.fk.past_date(start_date="-600d", tzinfo=None)  # 过去日期
        register_year_str = str(past_date).split('-', 1)[0]
        effective_year = int(register_year_str) + 10
        effective_year_str = str(effective_year)
        effective_date_str = effective_year_str + '-' + str(past_date).split('-', 1)[1]       # 有效日期
        logger.info(f"========= 用faker库生成的公司营业执照，公司成立日期为：{str(past_date)} ，有效日期为：{effective_date_str}=========")
        return str(past_date), effective_date_str

    # 8、随机生成10位小区名
    def get_random_community_name(self):
        """
         用random函数生成 xxxx小区名
         """
        end_name = "小区"
        start_name = """清幽别苑英伦爵邸沙世碧雅圣淘沙盛世豪庭巴黎风情安惠悦馨苑加美国际咏恒国度御墅临枫梦缘豪庭月湖景拜占庭嘉御龙庭罗马经典图拉柏佳境天城托斯卡纳希达尔城信步闲庭森和阳光小区京林公园小区福慧安家园"""
        suffix_name = "abcdefghijkmnopqrstuvwxyz1234567890"

        temp_start_name = random.sample(start_name, 4)
        get_start_name = ''.join(temp_start_name)

        temp_suffix_name = random.sample(suffix_name, 4)
        get_suffix_name = ''.join(temp_suffix_name)

        random_community_name_str = get_start_name + end_name + get_suffix_name
        logger.info(f"========= 用random函数生成随机小区名为：{random_community_name_str} =========")
        return random_community_name_str


# 测试代码
if __name__ == '__main__':
    handle_faker = HandleFaker()
    unregistered_phone = handle_faker.get_unregistered_phone()
    unregistered_user_name = handle_faker.get_unregistered_user_name()
    unregistered_user_name_specify_length = handle_faker.get_unregistered_user_name_specify_length(3)
    faker_address = handle_faker.get_faker_random_address()
    agent_name = handle_faker.random_agent_name()
    property_company_name = handle_faker.random_property_company_name()
    license_establish_validity_date = handle_faker.get_license_establish_validity_date()
    random_community_name = handle_faker.get_random_community_name()